
package PurchaseGUIs;

import Model.*;
import Supermarket.AppMessages;
import Supermarket.LoginUser;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.persistence.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author bagi - Manolis=debugging
 */
public class PurchaseForm extends javax.swing.JFrame {

    private static EntityManager em;
    private static LoginUser loginUser;
    private int selectedRow=0;
    private boolean completed;
    Customer customer;
    Store selectedStore;
    Product selectedProduct;
    Purchase purchase = new Purchase();
    List<ProductPurchase> productPurchaseList = new ArrayList<>();
    Integer quantity=0;
    JFrame thisFrame;
    
   
    public PurchaseForm() {
       em = InternalDBManager.getEm();
       initComponents();
       //ενεργοποίηση του πεδίου επιλογής καταστήματος κάθε φορά που τρέχει η φόρμα
       StoreComboBox.setEnabled(true);
       this.setIconImage(new
                ImageIcon(getClass().getResource("..\\Images\\cart.png")).getImage()); 
    }
    
    public PurchaseForm(LoginUser loginUser) {
       this.loginUser=loginUser;
       thisFrame = this;
       em = InternalDBManager.getEm();
       this.completed = false;
       initComponents();
       //ενεργοποίηση του πεδίου επιλογής καταστήματος κάθε φορά που τρέχει η φόρμα
       StoreComboBox.setEnabled(true);
       //αναζητεί και επιστρέφει τον πελάτη με βάση το userName
       customer=findCustomerInDB(loginUser.getUserName());
       //εισαγωγή στο αντικείμενο purchase του πελάτη 
       purchase.setCustomer(customer);
       //και της τρέχουσας ημερομηνίας 
       purchase.setDatetime(Calendar.getInstance().getTime()); 
       this.setIconImage(new
                ImageIcon(getClass().getResource("..\\Images\\cart.png")).getImage()); 
    }
    
    //βρίστκει τον πελάτη στη ΒΔ 
    private Customer findCustomerInDB(String userName){
        if (!em.getTransaction().isActive()){
           em.getTransaction().begin();
        }  
        //ψάχνει τον πελάτη με το userName
        Customer c_exists = (Customer)em.createNamedQuery("Customer.findByPointsCardNumber")
                .setParameter("pointsCardNumber", userName).getSingleResult();   
        return c_exists;
    } 
    
     //Ελέγχει εάν πατήθηκε το ποντίκι(επιλογή γραμμής από τη λίστα)
    private void checkIfRowIsChosen() {
        //Εάν επιλεχθεί γραμμή-εγγραφή από τo πίνακα των καταστημάτων, 
        selectedRow = ListOfProducts.getSelectedRow();
        //Ενεργοποιεί τo κουμπί της προσθήκης στο καλάθι
        AddProductButton.setEnabled(selectedRow >= 0);
    }

    //Μέθοδος επιβεβαιώσης αγοράς προϊόντος και επιλογή τεμαχίων αγοράς
    public String purchaseQuantity (Product selectedProduct){
        String q = "0";
        String confirmPrchMsg = "Επιβεβαίωση αγοράς";
        String confirmPurchaseMsg1 = "Το προϊόν " + selectedProduct.getProductName()+
              " προστέθηκε στο καλάθι σας. \n Παρακαλώ, δώστε τα επιθυμητά τεμάχια αγοράς: ";
        String confirmPurchaseMsg2 = " τεμάχια του προϊόντος " + selectedProduct.getProductName()+
              " προστέθηκαν στο καλάθι σας.";
        try {
            //Εμφανίζεται το παράθυρο-διάλογος και ζητά από το πελάτη τα τεμάχια αγοράς
            q =  JOptionPane.showInputDialog(null, confirmPurchaseMsg1, 
                    confirmPrchMsg,JOptionPane.OK_OPTION);
            if (!AppMessages.NumberEntryOnly(this,q)){
            //αναιρείται
                q = "0";
            } else {
                JOptionPane.showMessageDialog(null, q + confirmPurchaseMsg2, 
                    "Επιτυχής συναλλαγή", JOptionPane.INFORMATION_MESSAGE);
            }
        } catch (NullPointerException | NumberFormatException e) {
            //εάν ο πελάτης δεν καταχωρήσει ποσότητα ή πατήσει cancel
            }
        return q;
    }
  
    /**
     * This method is called from within the constructor to initialize the form.
     
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

        productQuery = java.beans.Beans.isDesignTime() ? null : em.createQuery("SELECT p FROM Product p");
        productList = java.beans.Beans.isDesignTime() ? java.util.Collections.emptyList() : org.jdesktop.observablecollections.ObservableCollections.observableList(productQuery.getResultList());
        storeQuery = java.beans.Beans.isDesignTime() ? null : em.createQuery("SELECT s FROM Store s");
        storeList = java.beans.Beans.isDesignTime() ? java.util.Collections.emptyList() : org.jdesktop.observablecollections.ObservableCollections.observableList(storeQuery.getResultList());
        jScrollPane1 = new javax.swing.JScrollPane();
        ListOfProducts = new javax.swing.JTable();
        jLabel1 = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        jLabel2 = new javax.swing.JLabel();
        AddProductButton = new javax.swing.JButton();
        GoToCartButton = new javax.swing.JButton();
        StoreComboBox = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Πραγματοποίηση αγοράς");
        setName("checkFrame"); // NOI18N
        setResizable(false);

        ListOfProducts.setAutoCreateRowSorter(true);
        ListOfProducts.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        ListOfProducts.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        ListOfProducts.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        ListOfProducts.setRowHeight(20);

        org.jdesktop.swingbinding.JTableBinding jTableBinding = org.jdesktop.swingbinding.SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, productList, ListOfProducts);
        org.jdesktop.swingbinding.JTableBinding.ColumnBinding columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${productId}"));
        columnBinding.setColumnName(" Id");
        columnBinding.setColumnClass(Integer.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${productName}"));
        columnBinding.setColumnName("Προϊόν");
        columnBinding.setColumnClass(String.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${code}"));
        columnBinding.setColumnName("Κωδικός προϊόντος");
        columnBinding.setColumnClass(String.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${price}"));
        columnBinding.setColumnName("Τιμή τεμαχίου €");
        columnBinding.setColumnClass(Float.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${points}"));
        columnBinding.setColumnName("Πόντοι αγοράς");
        columnBinding.setColumnClass(Integer.class);
        columnBinding.setEditable(false);
        bindingGroup.addBinding(jTableBinding);
        jTableBinding.bind();
        ListOfProducts.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                ListOfProductsMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(ListOfProducts);
        ListOfProducts.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        if (ListOfProducts.getColumnModel().getColumnCount() > 0) {
            ListOfProducts.getColumnModel().getColumn(0).setResizable(false);
            ListOfProducts.getColumnModel().getColumn(0).setPreferredWidth(50);
            ListOfProducts.getColumnModel().getColumn(1).setResizable(false);
            ListOfProducts.getColumnModel().getColumn(1).setPreferredWidth(250);
            ListOfProducts.getColumnModel().getColumn(2).setResizable(false);
            ListOfProducts.getColumnModel().getColumn(2).setPreferredWidth(80);
            ListOfProducts.getColumnModel().getColumn(3).setResizable(false);
            ListOfProducts.getColumnModel().getColumn(4).setResizable(false);
        }

        jLabel1.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jLabel1.setText("Διαθέσιμα προϊόντα:");

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel2.setText("Επιλογή καταστήματος:");

        AddProductButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/add-to-cart.png"))); // NOI18N
        AddProductButton.setText("Προσθήκη στο καλάθι");
        AddProductButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        AddProductButton.setEnabled(false);
        AddProductButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AddProductButtonActionPerformed(evt);
            }
        });

        GoToCartButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/go-to-cart.png"))); // NOI18N
        GoToCartButton.setText("Μετάβαση στο καλάθι");
        GoToCartButton.setEnabled(false);
        GoToCartButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                GoToCartButtonActionPerformed(evt);
            }
        });

        StoreComboBox.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        org.jdesktop.swingbinding.JComboBoxBinding jComboBoxBinding = org.jdesktop.swingbinding.SwingBindings.createJComboBoxBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, storeList, StoreComboBox);
        bindingGroup.addBinding(jComboBoxBinding);

        StoreComboBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                StoreComboBoxActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 722, Short.MAX_VALUE)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(AddProductButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(GoToCartButton))
                            .addComponent(jSeparator1)))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addGap(10, 10, 10)
                                .addComponent(jLabel1))
                            .addGroup(layout.createSequentialGroup()
                                .addContainerGap()
                                .addComponent(jLabel2)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(StoreComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 298, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(StoreComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(1, 1, 1)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 272, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(GoToCartButton, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)
                    .addComponent(AddProductButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        bindingGroup.bind();

        pack();
        setLocationRelativeTo(null);
    }// </editor-fold>//GEN-END:initComponents
   
    private void AddProductButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AddProductButtonActionPerformed
        //Επιλογή προϊόντος από τη λίστα
        selectedRow = ListOfProducts.getSelectedRow();

        //Εάν επιλεγεί προϊόν από τη λίστα, καλεί τη φόρμα επιβεβαίωσης 
        //και καταχώρησης τεμαχίων αγοράς
        if (selectedRow >= 0) {
            selectedProduct = productList.get(selectedRow);
            //τεμάχια αγοράς
            quantity=Integer.parseInt(purchaseQuantity (selectedProduct));
        }   
        if (quantity!=0){
            //Δημιουργία ενός αντικειμένου αγοράς προϊόντος 
            ProductPurchase pp = new ProductPurchase(selectedProduct, purchase, quantity);
            //Ενημέρωση λίστας προϊόντων αγοράς
            productPurchaseList.add(pp);
        }
        //αφού επιλεγεί το 1ο προϊόν
        if (productPurchaseList.size()==1){
            //απενεργοποιείται η δυνατότητα επιλογής καταστήματος, ώστε να μην 
            //μπορεί ο πελάτης να επιλέξει άλλο κατάστημα κατά την διάρκεια της ίδιας αγοράς
            StoreComboBox.setEnabled(false);
            //και ενεργοποιείται το κουμπί "Μετάβαση στο καλάθι" (εάν δεν είναι ήδη ενεργοποιημένο) 
            if (!GoToCartButton.isEnabled()){
                GoToCartButton.setEnabled(true);
            }
        }
    }//GEN-LAST:event_AddProductButtonActionPerformed

    private void GoToCartButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_GoToCartButtonActionPerformed
        //Με την ολοκλήρωση επιλογής των προϊόντων, ενημερώνεται το αντικείμενο αγοράς
        //με τα επιλεγμένα προϊόντα και τα ζητούμενα τεμάχια
        purchase.setProductPurchaseList(productPurchaseList);
        //και καλείται η φόρμα προβολή καλαθιού
        CartForm cartForm = new CartForm (this, true, purchase, customer);
        cartForm.setVisible(true);
        boolean completed = cartForm.getCompleted();
        cartForm.dispose();
        //αν έχει ολοκληρωθεί η αγορά τότε κλείνει η φόρμα αγορών
        if (completed){
            this.completed = true;
            this.dispose();
        } 
    }//GEN-LAST:event_GoToCartButtonActionPerformed

    private void StoreComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_StoreComboBoxActionPerformed
        //Εάν επιλεχθεί κατάστημα από το combo box
        if (StoreComboBox.getSelectedItem()!= null) {
            selectedStore = (Store) (storeList.get(StoreComboBox.getSelectedIndex()));
            //ενημερώνει το αντικείμενο αγοράς με το κατάστημα επιλογής
            purchase.setStore(selectedStore);
            //βρίσκει τα προϊόντα του καταστήματος που επιλέχθηκε από το πελάτη,
            List<Product> storeProducts = selectedStore.getProductList();
            //και ενημερώνει τη σχετική λίστα προϊόντων
            if (storeProducts .size() > 0) {
                productList.clear();
                for (Product p : storeProducts ) {
                    productList.add(p);
                }
            }
        }
    }//GEN-LAST:event_StoreComboBoxActionPerformed

    private void ListOfProductsMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_ListOfProductsMouseClicked
        //Ελέγχει αρχικά εάν πατήθηκε το ποντίκι (επιλογή γραμμής από τη λίστα)
        checkIfRowIsChosen();
        //Εάν το ποντίκι πατηθεί περισσότερες από 1 φορές, αυτόματα θεωρεί ότι
        //πρόκειται για προσθήκη στο καλάθι
        if (AddProductButton.isEnabled() && (evt.getClickCount() > 1)) {
            AddProductButtonActionPerformed(null);
        }        
    }//GEN-LAST:event_ListOfProductsMouseClicked
  
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(PurchaseForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(PurchaseForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(PurchaseForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(PurchaseForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new PurchaseForm().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton AddProductButton;
    private javax.swing.JButton GoToCartButton;
    private javax.swing.JTable ListOfProducts;
    private javax.swing.JComboBox StoreComboBox;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JSeparator jSeparator1;
    private java.util.List<Model.Product> productList;
    private javax.persistence.Query productQuery;
    private java.util.List<Model.Store> storeList;
    private javax.persistence.Query storeQuery;
    private org.jdesktop.beansbinding.BindingGroup bindingGroup;
    // End of variables declaration//GEN-END:variables

 //επιστρέφει μια σημαία για την ολοκλήρωση της συναλλαγής
    public boolean getCompleted(){
        return this.completed;
    }

}
